개발자 논리적인 사고력에 대해서

문제해결과 알고리즘 책을 읽고

Posted by Yungwang Ryu on 2019-01-04

들어가며

컴퓨팅사고력 향상을 위한 문제해결과 알고리즘에 대한 책을 읽으면서 개발자에 필수 역략인 문제해결 능력, 논리력, 절차적 사고력에 관한 정의와 개념이 잘되어 있어 내용을 정리하여 머릿속에 넣고 싶어 포스팅을 시작해 본다.

문제란?

현재 상태의 변화로 인해 본인이 원하는 방향의 목표 상태가 생기는 것을 의미

여려 요인에 의해서 이루어야(해결해야) 하는 목표가 생긴 상태

문제해결이란?

현재 상태와 목표 상태의 차이를 해결한 결과물

일반적 문제해결 과정

문제 이해 -> 해결 방안 고안 -> 해결책 선택 -> 실행 및 평가

컴퓨팅 기반 문제해결 과정

문제 이해 -> 해결 과정 설계 -> 프로그램이 구현 -> 결과물 확인

문제 이해

가장 중요한 단계라고 생각한다. 이 단계에서 정확하게 상황을 이해한다면 나머지 단계는 이행만 하면 되기 때문이다.

그러면 일반적 문제 이해를 어떻게 하면 올바르게 할 수 있을까?

  • 문제 상황에 대해 주어진 조건과 정보를 바르게 이해하고 파악하기
  • 문제가 무엇인지 문제의 상황과 조건을 바탕으로 논리적 사고에 의해 문제를 분석
  • 문제를 다양한 측면에서 이해하고 바라볼 수 있는 통합적 사고

그러면 컴퓨팅 기반 문제 이해를 어떻게 하면 올바르게 할 수 있을까?

  • 주어진 자료를 가지고 규칙이나 패턴을 찾아서 문제를 재 정의 한다.

책에서 말한 내용이지만 내생각을 표현해 보면 주어진 조건과 상황들을 조합하여 유추하고 결론을 이끌어 내며 편협적이지 않고 다양한 시선으로 생각하여 문제를 이해하는 능력을 말한다고 생각한다.

절차적 문제해결의 과정

문제해결 과정이란 문제를 해결하기 위해 필요한 절차 혹은 순서로 현재 상태에서 목표 상태로 도달하기 위한 일련의 인지적 처리 및 사고 활동의 과정을 순차적으로 나열하는 것… 여기서 말하는 절차 혹은 순서란 목제해결을 위한 인지적 처리 과정을 정해진 순서에 따라 하나씩 단계별로 나열하는 것으로, 우리는 이를 ‘절차적 문제해결 과정’ 이라고 한다.

종이접기

절차적 문제를 해결하는 적절한 예이다.
종이접기를 하려면 접는 순서데로 해야 원하는 종이접기 결과물을 만들어 낼 수 었다.

문제해결 하는 과정에서도 마찬가지라 생각이 든다. 목표로 하는 결과를 얻기 위해서 내가 어떤 과정을 밟아야 도달 할 수 있을까? 라는 생각하면서 논리적 사고력을 통해 절차를 만들어 가는게 정말 중요한 능력이라 생각한다.

알고리즘이란?

어떠한 주어진 문제를 해결하기 위한 절차적 순서나 방법

위에서 말한것 처럼 절차적인 사고를 통해 문제 해결을 한다고 하였는데 여기서 절차적인 사고를 표현 하는 방식이 알고리즘 이다.

자료구조란?

자료(데이터)를 정확하고 빠르게 얻기 위해 자료를 잘 정돈(구조화)하는 것을 말한다.

왜 자료구조가 필요할까?

방금 위에서 말하였지만 데이터를 정확하고 빠르게 얻기 위해서이다.
일상 생활에서 예를 들면 출근 시간이 늦어 빨리 옷을 입어야 하는 상황인데 옷정리를 하나도 하지 않고 심지어 겨울인데 여름옷이랑 섞여 있는 경우와 옷장에 용도와 계절에 맞게 구조적으로 정리된 옷장을 봤을때 어느 케이스가 더 정확하고 빠르게 옷을 골라 입을 수 있을까??

컴퓨터 입장에서도 옷을 고르기 위해, 데이터를 정화하고 빠르게 얻기 위해 그에 맞는 자료 구조화가 필요한것이다.

논리적 사고란

논리적 사고는 문제에서 해답을 이끌어 내는 과정이 타당하고, 분석적이며, 단계적인 사고를 의미. 논리적 사고는 문제해결 과정의 단계에 대한 조건 및 근거를 명확히 해야 하며, 이는 서로 유기적인 관계를 가져야 한다. ~~ 논리적이란 애매모한 것을 분명하게 밝힐 수 있어야 하며 논리적 사고력은 애매성에서 벗어나 명확성, 정확성을 갖출 수 있게 생각을 구체화 시키고 발전시켜 나갈 수 있어야 한다.

논리적 사고의 중요성

문제 해결을 하기 위해서는 절차적 사고가 필요하고 그 절차가 정확하려면 논리적인 사고가 필수 이다. 프로그래머가 어떤 기능 크게는 아키텍처를 구상한다고 했을 때 정확한 논리적 사고를 바탕으로 결론을 도출해야 정확한 기능과 서비스가 나온다고 생각한다.
논리적 사고는 프로그래머에 역량중에 역량이다.

논리적 사고력 기르기

생각하는 습관

평소 접하는 무엇이든 논리적으로 생각하는 습관을 길러야 한다.

상대 논리의 구조화

하고자 하는 일에 실패했을 때 문제 논리를 구조화 하고 원인 분석을 통해 논리를 재구조화 하여 문제를 해결 해야 한다.

구체적인 생각

나의 생각을 구체적으로 표현해야 한다. 예를 들어 그림을 그린다거나 도식으로 표현한다거나 나만의 편리하고 확실한 방법을 이용해 머릿속 생각을 끄집어 내어 구조화 시켜 뚜렷하게 생각을 표현하는 것이 중요하다.

타인에 대한 이해

상대방에 대한 생각과 논리를 피드백 삼아 나의 논리에 밑거름이 되게 하자

설득

논리적 사고는 고정된 생각이 아니다. 타인과 의논하면서 내가 깨닫지 못했던 내용을 발견하고 생각해 낼 수 있다.